/*
 * leerArchivoConfiguracion.c
 *
 *  Created on: 29/11/2011
 *      Author: utn_so
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <netdb.h>

extern char IP_ACTIVA[NI_MAXHOST];
extern char PUERTO_ACTIVO[10];
extern char IP_DISCO[NI_MAXHOST];
extern char PUERTO_DISCO[10];
extern char IP_RAID1[NI_MAXHOST];
extern char PUERTO_RAID1[10];
extern int32_t MAX_CONEXIONES;
extern int32_t TAMANIO_CACHE;

extern int8_t imprimirDebug;

int8_t leerArchivoConfiguracion() {
	int8_t error = 0;
	int8_t lecturaCorrecta = 0;

	while (!lecturaCorrecta && !error) {
		//LEO EL ARCHIVO DE CONFIGURACION
		FILE* fp;
		fp = fopen("/home/utn_so/Escritorio/fileSystem.config", "r");

		//SI NO SE CREO EL ARCHIVO
		while (fp == NULL) {
			printf("El archivo no se pudo leer, controle que se encuentre en [/home/utn_so/Escritorio/fileSystem.config].\n");
			printf("Presione Enter para continuar.\n");
			getchar();
			fp = fopen("/home/utn_so/Escritorio/fileSystem.config", "r");
		}

		fseek(fp, 0, SEEK_SET);
		char contenido[300];
		uint16_t i;
		for (i = 0; !feof(fp); i++)
			fread(contenido + i, 1, 1, fp);
		fclose(fp);

		if (i < 300)
			contenido[i] = '\0';

		char contenidoAux[300];
		uint16_t j;
		//ELIMINO LOS ESPACIOS
		for (i = 0, j = 0; i < 300; i++) {
			if (contenido[i] != ' ') {
				contenidoAux[j] = contenido[i];
				j++;
			}
		}

		memset(contenido, '\0', 300);

		//INICIALIZO LAS VARIABLES
		memset(IP_ACTIVA, '\0', NI_MAXHOST);
		memset(IP_DISCO, '\0', NI_MAXHOST);
		memset(IP_RAID1, '\0', NI_MAXHOST);
		memset(PUERTO_ACTIVO, '\0', NI_MAXHOST);
		memset(PUERTO_DISCO, '\0', NI_MAXHOST);
		memset(PUERTO_RAID1, '\0', NI_MAXHOST);
		MAX_CONEXIONES = -1;
		TAMANIO_CACHE = -1;

		i = 0;
		while (contenidoAux[i] != '\0' && !error) {
			if (imprimirDebug) {
				printf("Leo una linea del archivo de configuracion.\n");
			}
			memset(contenido, '\0', 300);
			j = 0;
			while ((i < 300) && (contenidoAux[i] != ':') && (contenidoAux[i] != '\0')) {
				contenido[j] = contenidoAux[i];
				i++;
				j++;
			}
			if (contenidoAux[i] == ':') {
				if (imprimirDebug) {
					printf("%s\n", contenido);
				}
				i++;
				if (strcmp(contenido, "IPdelDisco") == 0) {
					memset(contenido, '\0', 300);
					j = 0;
					while ((i < 300) && (contenidoAux[i] != '\n') && (contenidoAux[i] != '\0')) {
						contenido[j] = contenidoAux[i];
						i++;
						j++;
					}
					if (contenidoAux[i] == '\n')
						i++;
					for (j = 0; contenido[j] != '\0'; j++) {
						IP_DISCO[j] = contenido[j];
						IP_ACTIVA[j] = contenido[j];
					}
					IP_DISCO[j] = '\0';
					IP_ACTIVA[j] = '\0';
					if (imprimirDebug) {
						printf("%s\n", IP_DISCO);
					}
					//IP = atoi(contenido);
				} else if (strcmp(contenido, "PuertodelDisco") == 0) {
					memset(contenido, '\0', 300);
					j = 0;
					while ((i < 300) && (contenidoAux[i] != '\n') && (contenidoAux[i] != '\0')) {
						contenido[j] = contenidoAux[i];
						i++;
						j++;
					}
					if (contenidoAux[i] == '\n')
						i++;
					for (j = 0; contenido[j] != '\0'; j++) {
						PUERTO_DISCO[j] = contenido[j];
						PUERTO_ACTIVO[j] = contenido[j];
					}
					PUERTO_DISCO[j] = '\0';
					PUERTO_ACTIVO[j] = '\0';
					if (imprimirDebug) {
						printf("%s\n", PUERTO_DISCO);
					}
					//PUERTO = atoi(contenido);
				} else if (strcmp(contenido, "IPdelRaid1") == 0) {
					memset(contenido, '\0', 300);
					j = 0;
					while ((i < 300) && (contenidoAux[i] != '\n') && (contenidoAux[i] != '\0')) {
						contenido[j] = contenidoAux[i];
						i++;
						j++;
					}
					if (contenidoAux[i] == '\n')
						i++;
					for (j = 0; contenido[j] != '\0'; j++)
						IP_RAID1[j] = contenido[j];
					IP_RAID1[j] = '\0';
					if (imprimirDebug) {
						printf("%s\n", IP_RAID1);
					}
					//IP = atoi(contenido);
				} else if (strcmp(contenido, "PuertodelRaid1") == 0) {
					memset(contenido, '\0', 300);
					j = 0;
					while ((i < 300) && (contenidoAux[i] != '\n') && (contenidoAux[i] != '\0')) {
						contenido[j] = contenidoAux[i];
						i++;
						j++;
					}
					if (contenidoAux[i] == '\n')
						i++;
					for (j = 0; contenido[j] != '\0'; j++)
						PUERTO_RAID1[j] = contenido[j];
					PUERTO_RAID1[j] = '\0';
					if (imprimirDebug) {
						printf("%s\n", PUERTO_RAID1);
					}
				} else if (strcmp(contenido, "MaximaCantidaddeConexiones") == 0) {
					memset(contenido, '\0', 300);
					j = 0;
					while ((i < 300) && (contenidoAux[i] != '\n') && (contenidoAux[i] != '\0')) {
						contenido[j] = contenidoAux[i];
						i++;
						j++;
					}
					if (contenidoAux[i] == '\n')
						i++;
					MAX_CONEXIONES = atoi(contenido);
					if (imprimirDebug) {
						printf("%d\n", MAX_CONEXIONES);
					}
				} else if (strcmp(contenido, "TamaniodelaCache") == 0) {
					memset(contenido, '\0', 300);
					j = 0;
					while ((i < 300) && (contenidoAux[i] != '\n') && (contenidoAux[i] != '\0')) {
						contenido[j] = contenidoAux[i];
						i++;
						j++;
					}
					if (contenidoAux[i] == '\n')
						i++;
					TAMANIO_CACHE = atoi(contenido);
					if (imprimirDebug) {
						printf("%d\n", TAMANIO_CACHE);
					}
				}
			} else if (((uint8_t) contenido[0]) == 191) {
				if (imprimirDebug) {
					printf("Se llego al fin del archivo.\n");
				}
			} else if (contenido[0] == 0) {
				i++;
			} else {
				//EL FORMATO ES INCORRECTO
				if (imprimirDebug) {
					printf("El formato del archivo de configuracion es incorrecto.\n");
				}
			}
		}
		if ((IP_ACTIVA[0] == '\0') || (PUERTO_ACTIVO[0] == '\0') || (IP_DISCO[0] == '\0') || (PUERTO_DISCO[0] == '\0') || (IP_RAID1[0] == '\0') || (PUERTO_RAID1[0] == '\0') || (MAX_CONEXIONES == -1) || (TAMANIO_CACHE == -1)) {
			//NO SE CARGARON TODOS LOS DATOS
			printf("Faltan datos en el archivo de configuracion o el formato es incorrecto.\n");
			printf("Presione Enter para continuar.\n");
			getchar();
		} else {
			lecturaCorrecta = 1;
			printf("============================================================\n");
			printf("             DATOS DEL ARCHIVO DE CONFIGURACION             \n");
			printf("============================================================\n");
			printf("IP del Planificador de Disco: %s\n", IP_DISCO);
			printf("Puerto del Planificador de Disco: %s\n", PUERTO_DISCO);
			printf("IP del Raid1: %s\n", IP_RAID1);
			printf("Puerto del Raid1: %s\n", PUERTO_RAID1);
			printf("Maxima Cantidad de Conexiones: %d\n", MAX_CONEXIONES);
			printf("Tamanio de la Cache: %dkB\n", TAMANIO_CACHE);
			printf("============================================================\n");
			printf("\n\n");
		}
	}

	return error;
}
